

 #include <stdio.h>
 #include <unistd.h>
 #include <string.h>
 
 #include "ohos_init.h"
 #include "cmsis_os2.h"
 
 // 包含子模块头文件
 #include "hal_bsp_ssd1306.h"
 #include "hal_bsp_sht20.h"
 
 #define TASK_STACK_SIZE (4 * 1024) // 增加栈大小
 #define TASK_PRIO 25
 #define SENSOR_READ_INTERVAL_MS 1000 // 传感器读取间隔 1秒
 #define DISPLAY_REFRESH_INTERVAL_MS 1000 // 显示刷新间隔 1秒
 
 // 全局变量存储温湿度数据
 static float g_temperature = -99.0f;
 static float g_humidity = -99.0f;
 // 可选：添加互斥锁保护全局变量
 // static osMutexId_t g_sensorDataMutex;
 
 // 传感器读取任务
 static void SensorReadTask(void *arg)
 {
     (void)arg;
     printf("SensorReadTask started.\n");
 
     // 初始化SHT20传感器
     SHT20_Init(); 
 
     while (1)
     {
         float temp = 0.0f;
         float humi = 0.0f;
         
         // 读取温湿度数据
         SHT20_ReadData(&temp, &humi);
         
         g_temperature = temp;
         g_humidity = humi;

         // printf("Read Sensor: Temp=%.2f, Humi=%.2f\n", temp, humi); // 调试信息
         osDelay(SENSOR_READ_INTERVAL_MS);
     }
 }
 
 // OLED显示任务
 static void OledDisplayTask(void *arg)
 {
     (void)arg;
     char tempStr[16] = {0};
     char humidStr[16] = {0};
     float local_temp, local_humi;
 
     printf("OledDisplayTask started.\n");
 
     // 初始化OLED
     SSD1306_Init();
     SSD1306_CLS(); // 清屏
 
     // 显示静态文本
     SSD1306_ShowStr(0, 0, (uint8_t*)"Temp & Humi", 16);
     SSD1306_ShowStr(0, 1, (uint8_t*)"Temp:", 16);
     SSD1306_ShowStr(0, 2, (uint8_t*)"Humi:", 16);
     SSD1306_ShowStr(90, 1, (uint8_t*)" C", 16); // 添加空格以覆盖旧数据
     SSD1306_ShowStr(90, 2, (uint8_t*)" %", 16); // 添加空格以覆盖旧数据
 
     while(1)
     {
    
    
         local_temp = g_temperature;
         local_humi = g_humidity;

         // 格式化数据字符串
         if (local_temp > -90.0f) { // 检查是否已读取到有效数据
              sprintf(tempStr, "%.2f", local_temp);
         } else {
             sprintf(tempStr, "--.--");
         }
        
         if (local_humi > -90.0f) { // 检查是否已读取到有效数据
              sprintf(humidStr, "%.2f", local_humi);
         } else {
              sprintf(humidStr, "--.--");
         }
         
         // 清除之前的数值区域 (通过显示空格实现)
         SSD1306_ShowStr(40, 1, (uint8_t*)"       ", 16); 
         SSD1306_ShowStr(40, 2, (uint8_t*)"       ", 16); 
 
         // 显示最新的温湿度值
         SSD1306_ShowStr(40, 1, (uint8_t *)tempStr, 16);
         SSD1306_ShowStr(40, 2, (uint8_t *)humidStr, 16);
 
         osDelay(DISPLAY_REFRESH_INTERVAL_MS);
     }
 }
 
 // 应用入口函数
 static void OledTempHumiDisplayEntry(void)
 {
     osThreadAttr_t sensorTaskAttr = {0};
     osThreadAttr_t displayTaskAttr = {0};

     // 配置传感器读取任务
     sensorTaskAttr.name = "SensorReadTask";
     sensorTaskAttr.stack_size = TASK_STACK_SIZE;
     sensorTaskAttr.priority = TASK_PRIO;
 
     // 配置OLED显示任务
     displayTaskAttr.name = "OledDisplayTask";
     displayTaskAttr.stack_size = TASK_STACK_SIZE;
     displayTaskAttr.priority = TASK_PRIO;
 
     // 创建传感器读取任务
     if (osThreadNew(SensorReadTask, NULL, &sensorTaskAttr) == NULL) {
         printf("[OledTempHumiDisplay] Failed to create SensorReadTask!\n");
     }
 
     // 创建OLED显示任务
     if (osThreadNew(OledDisplayTask, NULL, &displayTaskAttr) == NULL) {
         printf("[OledTempHumiDisplay] Failed to create OledDisplayTask!\n");
     }
 }
 
 // 注册应用入口
 APP_FEATURE_INIT(OledTempHumiDisplayEntry);